package com.grape.redis.service.impl;

import com.grape.redis.service.IRedisService;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author  putao
 * @email   2628279194@qq.com
 */
@Component
@AllArgsConstructor
public class RedisServiceImpl implements IRedisService {

    private final StringRedisTemplate template;

    /**
     * 存入redis
     * @param phone         手机号码
     * @param verifyCode    验证码
     * @param minute        时间（分）
     * @param timeType      时间类型
     */
    @Override
    public void set(String phone, String verifyCode, Long minute, TimeUnit timeType) {
        template.opsForValue().set(phone, verifyCode, minute, timeType);
    }

    /**
     * 存入redis并设置时间，时间类型：秒
     * @param key       设置的key
     * @param value     设置的值
     * @param seconds   时间（秒）
     */
    @Override
    public void setAndTime(String key, String value, Long seconds) {
        template.opsForValue().set(key, value, seconds, TimeUnit.SECONDS);
    }

    /**
     * 往redis存入数据，value是json格式
     * @param joinedKey 拼接后的key
     * @param value     设置的值
     */
    @Override
    public void set(String joinedKey, String value) {
        template.opsForValue().set(joinedKey, value);
    }

    /**
     * 根据key查出对应的value
     * @param key   存入数据的key
     * @return      key对应的值
     */
    @Override
    public String get(String key) {
        return template.opsForValue().get(key);
    }

    /**
     * 获取剩余时间
     * @param key       存入数据的key
     * @return          存入数据的剩余时间
     */
    @Override
    public Long getTime(String key) {
        return template.opsForValue().getOperations().getExpire(key);
    }

    /**
     * 根据指定Key删除value
     * @param key       存入数据的key
     * @return          是否成功（true：成功，false：失败）
     */
    @Override
    public boolean deleteKey(String key) {
        return Boolean.TRUE.equals(template.delete(key));
    }

    /**
     * List操作：根据指定Key左边插入value
     * @param key   存入数据的key
     * @param value 存入数据
     * @return      是否成功（true：成功，false：失败）
     */
    @Override
    public Long leftPush(String key, String value) {
        return template.opsForList().leftPush(key, value);
    }

    /**
     * 判断key是否存在于redis中
     * @param key       存入数据的key
     * @return          是否成功
     */
    @Override
    public boolean hasKey(String key) {
        return Boolean.TRUE.equals(template.hasKey(key));
    }
}
